package com.igeek.shop.web.houtai;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.igeek.common.utils.CommonUtils;
import com.igeek.shop.entity.Category;
import com.igeek.shop.entity.Product;
import com.igeek.shop.service.ListService;
import com.igeek.shop.service.ProductServiceImpl;

public class AdminServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ListService list = new ListService();
	private ProductServiceImpl ps= new ProductServiceImpl();
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		String state = req.getParameter("state");
		if(state.equals("delect")){
			delect(req,resp);
		}else if(state.equals("SPDisplay")){
			spdisplay(req,resp);
		}else if(state.equals("add")){
			add(req,resp);
		}else if (state.equals("lb")){
			lb(req,resp);
			
		}else if(state.equals("bj")){
			bj(req,resp);
			
		}else if(state.equals("submit")){
			submit(req,resp);
		}
	}
	
	private void submit(HttpServletRequest req, HttpServletResponse resp) {
		// TODO Auto-generated method stub
			String pid = (String) req.getSession().getAttribute("pid");
			
		try {
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 第二步 指定一个临时目录(缓冲区) this.getServletContext().getRealPath(); application 对象中的方法。
			String temp_path = this.getServletContext().getRealPath("temp");
			// System.out.println(temp_path);
			File file = new File(temp_path);
			if (!file.exists()) {
				file.mkdirs();// 不存在就创建临时路径 。
			}
			// 设置你的缓冲区大小 。1024 1KB 1MB...
			factory.setSizeThreshold(1024 * 1024);// 1MB
			factory.setRepository(file);// 指定缓冲区的位置 。
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 处理上传之后的文件乱码。
			upload.setHeaderEncoding("utf-8");
			// isMultipartContent 判断以下 当前请求的类型 到底是一个文件上传 还是一个普通的表单提交 。
			
			//创建一个Map集合 ，用来存储 循环遍历数据的名值对儿 。
			Map<String,String> map = new HashMap<String,String>();
			
			List<FileItem> fileItemList = upload.parseRequest(req);
			for (FileItem fileItem : fileItemList) {
				if(fileItem.isFormField()) {//判断是否是一个普通的表单元素。
					String fieldName = fileItem.getFieldName();
					String fieldValue = fileItem.getString("utf-8");
					map.put(fieldName, fieldValue);
				}else {
					String fieldName = fileItem.getFieldName();
					//拿到要上传的文件名称。
					String fileName = fileItem.getName();
					//通过输入流表示拿到的数据 。
					InputStream input = fileItem.getInputStream();
					//拿到要上传的位置 。
					String path = this.getServletContext().getRealPath("products/1");
					fileItem.write(new File(path+"/"+fileName));
					//把输入的内容(其实就是你要上传的文件，写入到指定位置。)
					fileItem.write(new File("E:\\wwwww\\IGEEKShop\\WebContent\\products\\1\\"+fileName));//拼接上文件的名称还有后缀 。
					//写完之后 需要知道文件上传到什么位置了 。
					map.put(fieldName, "products/1/"+fileName);
					input.close();//把流关闭 。
					fileItem.delete();//清空缓冲区中的临时文件。
				}
			}
			//System.out.println(map);  封装数据 。
			Product product = new Product();
			BeanUtils.populate(product, map);
			product.setPid(CommonUtils.getUUID());
			product.setPflag(0);
			product.setPdate(CommonUtils.getTime());
			ps.BJinsertProduct(product,pid);
			spdisplay(req,resp);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void bj(HttpServletRequest req, HttpServletResponse resp) {
		// TODO Auto-generated method stub
		List<Category> cate = list.lb();
		req.setAttribute("cate", cate);
		String pid = req.getParameter("pid");
		req.getSession().setAttribute("pid", pid);
		Product product = list.querypro(pid);
		req.setAttribute("product", product);
		try {
			req.getRequestDispatcher("/admin/product/edit.jsp").forward(req, resp);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
	private void lb(HttpServletRequest req, HttpServletResponse resp) {
		// TODO Auto-generated method stub
		List<Category> cate = list.lb();
		req.setAttribute("cate", cate);
		try {
			req.getRequestDispatcher("/admin/product/add.jsp").forward(req, resp);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		try {
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 第二步 指定一个临时目录(缓冲区) this.getServletContext().getRealPath(); application 对象中的方法。
			String temp_path = this.getServletContext().getRealPath("temp");
			// System.out.println(temp_path);
			File file = new File(temp_path);
			if (!file.exists()) {
				file.mkdirs();// 不存在就创建临时路径 。
			}
			// 设置你的缓冲区大小 。1024 1KB 1MB...
			factory.setSizeThreshold(1024 * 1024);// 1MB
			factory.setRepository(file);// 指定缓冲区的位置 。
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 处理上传之后的文件乱码。
			upload.setHeaderEncoding("utf-8");
			// isMultipartContent 判断以下 当前请求的类型 到底是一个文件上传 还是一个普通的表单提交 。
			
			//创建一个Map集合 ，用来存储 循环遍历数据的名值对儿 。
			Map<String,String> map = new HashMap<String,String>();
			
			List<FileItem> fileItemList = upload.parseRequest(request);
			System.out.println(fileItemList);
			for (FileItem fileItem : fileItemList) {
				if(fileItem.isFormField()) {//判断是否是一个普通的表单元素。
					String fieldName = fileItem.getFieldName();
					String fieldValue = fileItem.getString("utf-8");
					map.put(fieldName, fieldValue);
				}else {
					String fieldName = fileItem.getFieldName();
					//拿到要上传的文件名称。
					String fileName = fileItem.getName();
					//通过输入流表示拿到的数据 。
					InputStream input = fileItem.getInputStream();
					//拿到要上传的位置 。
					String path = this.getServletContext().getRealPath("products/1");
					fileItem.write(new File(path+"/"+fileName));
					//把输入的内容(其实就是你要上传的文件，写入到指定位置。)
					fileItem.write(new File("E:\\wwwww\\IGEEKShop\\WebContent\\products\\1\\"+fileName));//拼接上文件的名称还有后缀 。
					//写完之后 需要知道文件上传到什么位置了 。
					map.put(fieldName, "products/1/"+fileName);
					input.close();//把流关闭 。
					fileItem.delete();//清空缓冲区中的临时文件。
				}
			}
			//System.out.println(map);  封装数据 。
			Product product = new Product();
			BeanUtils.populate(product, map);
			product.setPid(CommonUtils.getUUID());
			product.setPflag(0);
			product.setPdate(CommonUtils.getTime());
			System.out.println(product);
			ps.insertProduct(product);
			spdisplay(request,response);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void spdisplay(HttpServletRequest req, HttpServletResponse resp) {
		// TODO Auto-generated method stub
		//显示商品类别
		List<Product>product =(List<Product>) list.spdisplay();
		req.setAttribute("product", product);
		try {
			req.getRequestDispatcher("/admin/product/list.jsp").forward(req, resp);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private void delect(HttpServletRequest req, HttpServletResponse resp) {
		// TODO Auto-generated method stub
		String pid = req.getParameter("pid");
		list.delectpro(pid);
		spdisplay(req,resp);
	}	
	
}
